/**
 * 功能:判断是否为空
 * @param v ：判断的数据
 * @returns {boolean}
 */
export function isEmpty(v) {
	switch (typeof v) {
		case 'undefined':
			return true;
		case 'string':
			if (v.replace(/(^[ \t\n\r]*)|([ \t\n\r]*$)/g, '').length == 0) return true;
			break;
		case 'boolean':
			if (!v) return true;
			break;
		case 'number':
			if (v === 0 || isNaN(v)) return true;
			break;
		case 'object':
			if (v === null || v.length === 0) return true;
			for (const i in v) {
				return false;
			}
			return true;
			break;
		default:
			return false;
	}
	return false;
}

/**
 * 功能：判断对象是否存在且不为空(依次判断字符串、数组、对象)，如下例：
 * @param object 需要设置属性值的对象
 * */
export function is_not_empty(object) {
	return object != undefined && object != null && JSON.stringify(object) != '' && JSON.stringify(object) != '[]' &&
		JSON.stringify(object) != '{}';
}

/**
 * 功能:判断格式是否为符合要求
 * @param t:判断的数据的类型
 * @param s:判断的数据
 * @param bob:是否默认提示 默认值true
 * @returns {boolean}
 */
export function format(t, s, bob = true) {
	switch (t) {
		case 'tel':
			if (/^1[3-9]\d{9}$/.test(s)) {
				return true
			}
			if (bob) {
				uni.$u.toast('手机号格式错误')
			}
			return false;
		case 'password':
			if (/^[\w!@#$%^&*()-=_+~`[\]{}|;:'",.<>/?]{6,}$/.test(s)) {
				return true
			}
			uni.$u.toast('密码格式为数字和字母以及特殊字符构成且最少6位数')
			return false;
			break;
		case 'card':
			// 去除空格
			s = s.replace(/\s/g, '');

			// 银行卡号必须为16位或19位数字
			if (/^(\d{16}|\d{19})$/.test(s)) {
				return true;
			} else {
				uni.$u.toast('银行卡号应为16位或19位数，请仔细检查')
				return false
			}
			break;
		case 'email':
			// 邮箱
			if (/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(s)) {
				return true;
			} else {
				if (bob) {
					uni.$u.toast('邮箱格式错误')
				}
				return false
			}
			break;
		default:
			return false;
	}
	return false;
}


/**
 * 功能:将毫秒数格式化时间的函数，，时间格式（2023-08-09 12:00）
 * @param milliseconds:毫秒数
 * @returns {string}
 */

export function formatTime(milliseconds) {
	const date = new Date(milliseconds);
	const year = date.getFullYear();
	const month = String(date.getMonth() + 1).padStart(2, '0');
	const day = String(date.getDate()).padStart(2, '0');
	const hours = String(date.getHours()).padStart(2, '0');
	const minutes = String(date.getMinutes()).padStart(2, '0');

	return `${year}-${month}-${day} ${hours}:${minutes}`;
}


/**
 * 功能:将毫秒数格式化时间的函数，，时间格式（2023-08-09）
 * @param milliseconds:毫秒数
 * @returns {string}
 */

export function formatDate(milliseconds) {
	const date = new Date(milliseconds);
	const year = date.getFullYear();
	const month = String(date.getMonth() + 1).padStart(2, '0');
	const day = String(date.getDate()).padStart(2, '0');

	return `${year}-${month}-${day}`;
}

/**
 * 功能:将毫秒数格式化时间的函数，，时间格式（2023-08）
 * @param milliseconds:毫秒数
 * @returns {string}
 */

export function formatDateMon(milliseconds) {
	const date = new Date(milliseconds);
	const year = date.getFullYear();
	const month = String(date.getMonth() + 1).padStart(2, '0');
	const day = String(date.getDate()).padStart(2, '0');

	return `${year}-${month}`;
}



/**
 * 功能:格式化时间  date是new Date() 的标准时间   返回 2023-12-03
 * @param date:new Date() 的标准时间
 * @returns {string}
 */
export function getFormat(date) {
	const year = date.getFullYear();
	const month = ("0" + (date.getMonth() + 1)).slice(-2);
	const day = ("0" + date.getDate()).slice(-2);

	return `${year}-${month}-${day}`;
}

/**
 * 功能:获取本月日期
 * @param date:new Date() 的标准时间
 * @returns {string}
 */

export function getThisMonthDates() {
	const currentDate = new Date();
	const year = currentDate.getFullYear();
	const month = currentDate.getMonth() + 1;

	const firstDay = new Date(year, month - 1, 1);
	const lastDay = new Date(year, month, 0);

	const formattedFirstDay = getFormat(firstDay);
	const formattedLastDay = getFormat(lastDay);

	return [formattedFirstDay, formattedLastDay];
}


/**
 * 功能:获取月初始和月末时间
 * @param timeInMilliseconds:毫秒数
 * @returns {string}
 */
export function getMonthStartAndEnd(timeInMilliseconds) {
	const date = new Date(timeInMilliseconds);
	const year = date.getFullYear();
	const month = date.getMonth();

	const monthStart = new Date(year, month, 1);
	const monthEnd = new Date(year, month + 1, 0);

	return [getFormat(monthStart), getFormat(monthEnd)]
}



/**
 * 功能:防抖
 * @param func:函数，
 * @param delay:延迟时间，
 * @returns {string}
 */
export function debounce(func, delay) {
	let timer = null;
	return function() {
		const context = this;
		const args = arguments;
		clearTimeout(timer);
		timer = setTimeout(function() {
			func.apply(context, args);
		}, delay);
	};
}





/**
 * 功能:节流
 * @param func:函数，
 * @param delay:延迟时间，
 * @returns {string}
 */
export function throttle(func, delay) {
	let timer = null;
	return function() {
		const context = this;
		const args = arguments;
		if (!timer) {
			func.apply(context, args);
			timer = setTimeout(function() {
				timer = null;
			}, delay);
		}
	};
}



/**
 * 功能:生成唯一值
 * @returns {string}
 */
export function uuidData() {
	return getApp().uuid.v4().toUpperCase()
}


// 将各种格式的字符串转换为完整的数字
export const fileterData = (e) => {
	let val = e == null ? '' : e;
	let match = (val + "").replace(/^0{1,}[.]/gi, "0.").replace(/^0{1,}(\d+)/gi, "$1").match(/\d+[.]?\d{0,2}/);
	return match && match.length ? match[0] : '';
}


/**
 * 发起订阅消息
 * @param o
 */
export function sendSubscribeMsg({
	subscribeIds,
	throwError = true
}) {
	return new Promise((resolve, reject) => {
		//判断是否支持订阅消息
		if (!uni.requestSubscribeMessage) {
			throwError ? resolve() : reject({
				msg: '当前微信版本不支持订阅消息'
			});
		} else {
			uni.getSetting({
				withSubscriptions: true,
				success: (res) => {
					if (res && res !== void 0) {
						if (!res.hasOwnProperty('subscriptionsSetting')) {
							throwError ? resolve() : reject({
								msg: '当前微信版本不支持订阅消息'
							});
						} else {
							console.info("subscriptions", res)
							const subscriptions = res.subscriptionsSetting;
							const hadItemSettings = subscriptions.hasOwnProperty('itemSettings');
							let openSettingFun = function() {
								uni.showModal({
									title: '订阅消息',
									content: '需要您勾选消息订阅',
									cancelText: '无须订阅',
									confirmText: '打开订阅',
									success(res) {
										if (res.confirm) {
											uni.openSetting({
												success(res) {
													return resolve(res);
												},
												fail(res) {
													return resolve(res);
												}
											});
										} else if (res.cancel) {
											throwError ? resolve() : reject({
												msg: '取消打开消息订阅设置'
											});
										}
									}
								})
							}
							if (!subscriptions.mainSwitch) {
								//订阅总开关未打开
								openSettingFun();
								return
							} else if (hadItemSettings) {
								//存在拒绝订阅某个消息
								let bol = true;
								subscribeIds.forEach(item => {
									if (bol && subscriptions.itemSettings[item] ===
										'reject') {
										bol = false;
									}
								})
								if (!bol) {
									openSettingFun();
									return
								}
							}
							uni.requestSubscribeMessage({
								tmplIds: subscribeIds,
								success: (res) => {
									if (res[subscribeIds[0]] == 'accept') {
										console.info("已同意订阅消息", res)
										resolve()
									} else {
										console.info("已拒绝订阅消息", res)
										reject()
									}
								},
								fail: (res) => {
									console.info("已拒绝订阅消息", res)
									reject()
								}
								// complete: () => {
								// 	resolve()
								// }
							})
						}
					} else {
						resolve(res);
					}
				}
			})
		}
	})
}


// 过滤手机号数据
export function filterPhone(phone) {
	return phone?.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2') || ''
}

// 过滤密码数据
export function filterPwd(pwd) {
	return pwd?.replace(/./gi, '*') || ''
}

// 过滤名称数据
export function filterName(name) {
	// return name?.replace(/.+?/gi, '*') || ''
	return name ? name.slice(0, 1) + name.slice(1).replace(/./gi, '*') : ''
}

// 过滤银行卡编号数据
export function filterCardNum(cardNum, showNum = false) {
	// return cardNum?.replace(/./gi, '*') || ''
	if (!cardNum)
		return ''
	let len = cardNum.length;
	// 共16, 每4位一个空格
	let cardNumStr = "";
	for (let i = 0; i < (len / 4 - 1); i++) {
		cardNumStr += ((showNum ? cardNum.slice(i * 4, i * 4 + 4) : '****') + " ")
	}
	return cardNumStr + cardNum.slice(-4)
}